/*
 * Comportamiento que permite que el agente Productor
 * pueda negociar con el agente Camion
 */

package agentes09.negotiation.behaviours;

import jade.core.AID;
import jade.core.behaviours.CyclicBehaviour;
import jade.lang.acl.ACLMessage;
import java.util.Vector;

/**
 *
 * @author Pablo Javier Vidal
 */
public class NegociacionProductor extends CyclicBehaviour{

    private Vector vector = new Vector(); //vector utilizado para guardar los
                                          //AIDs de cada camion que ha aceptado negociar
    private double []arraysPrecios;       //arrays que permite guardar los precios de aquellos agentes que estan negociando
    private int ofertasRecibidas = 0;     //contador para saber cuantas ofertas llevo
    private ACLMessage respuesta = null;  //utilizado para generar una respuesta
    private ACLMessage mensaje = null;    //utilizado para guardar el mensaje recibido
    


    @Override
    public void action() {
        mensaje = myAgent.receive();
        if (mensaje != null)
        {             
             if (mensaje.getPerformative() == ACLMessage.ACCEPT_PROPOSAL)
             {
                 //un agente acepto la propuesta de negociacion y le solicito
                 //el precio por llevar el paquete.
                 vector.add(mensaje.getSender());      //guardo el AID
                 respuesta = mensaje.createReply();
                 respuesta.setPerformative(ACLMessage.REQUEST);
                 myAgent.send(respuesta);                 
             }
             else if (mensaje.getPerformative() == ACLMessage.REJECT_PROPOSAL)
             {
                 //propuesta de necogiacion rechazada por el agente camion que mando el mensaje
                //System.out.println("AGENTE "+mensaje.getSender().getLocalName()  +"  RECHAZO LA PROPUESTA");
             }             
             else if (mensaje.getPerformative() == ACLMessage.INFORM)
             {
                 //recibo todas las ofertas de los agentes que participan en la negociacion

                 if (ofertasRecibidas == 0) arraysPrecios = new double[vector.size()];
                //ACLMessage.AGREE
                double valor = Double.parseDouble(mensaje.getContent());
                ofertasRecibidas++;
                if (ofertasRecibidas == vector.size())
                {
                    int indiceGanador = 0;
                    double comparator = 0;
                    for (int i = 0; i < arraysPrecios.length; i++) {
                        if (arraysPrecios[i] < comparator)
                        {
                            comparator = arraysPrecios[i];
                            indiceGanador = i;
                        }
                    }
                    respuesta = mensaje.createReply();
                    respuesta.clearAllReceiver();
                    respuesta.addReceiver((AID) vector.get(indiceGanador));
                    respuesta.setPerformative(ACLMessage.AGREE);
                    myAgent.send(respuesta);
                    for (int i = 0; i < arraysPrecios.length; i++) {
                     if (i == indiceGanador)
                     {}
                     else
                     {
                        mensaje = new ACLMessage(ACLMessage.REFUSE);
                        mensaje.addReceiver((AID) vector.get(i));                        
                        myAgent.send(mensaje);
                     }//fin else del if i == indiceGanadors
                  }//fin for para mandar el mensaje re rechazado a los otros agentes
                }//fin if (recibidos == vector.size())
             }//fin else if (mensaje.getPerformative() == ACLMessage.INFORM)
        }//if (mensaje != null)
        else block();    
    }//fin metodo action
}
